package kubernetes

import (
	"encoding/json"
	"k8s-admin/global"
	"k8s-admin/utils"

	appsv1 "k8s.io/api/apps/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type DaemonList struct {
	Items []appsv1.DaemonSet `json:"items"`
	Total int                `json:"total"`
}

// CreteClusterDaemon 通过yaml方式创建daemonSet资源
func (c *k8sCluster) CreteClusterDaemonSet(cid, Namespace, DaemonData string) error {
	/**
	DaemonData: 是一个base64编码json字符串，需要先将其进行base64解码然后转换为DaemonSet对象，然后再调用Update方法更新资源。
	*/
	ctx, cancel, cache, err := utils.ClusterClient(cid)
	defer cancel()
	if err != nil {
		global.TPLogger.Error("CreteClusterDaemon", "error", err)
		return err
	}

	data, err := utils.DecodeBase64(DaemonData) // 将前端base64编码的字符串解码为原始数据
	if err != nil {
		global.TPLogger.Error("UpdateClusterDaemon", "error", err)
		return err
	}
	daemonSet := &appsv1.DaemonSet{}
	err = json.Unmarshal([]byte(data), daemonSet)
	if err != nil {
		global.TPLogger.Error("UpdateClusterDaemon", "error", err)
		return err
	}

	_, err = cache.AppsV1().DaemonSets(Namespace).Create(ctx, daemonSet, metav1.CreateOptions{})
	if err != nil {
		global.TPLogger.Error("CreteClusterDaemon", "error", err)
		return err
	}

	return nil
}
func (c *k8sCluster) GetClusterDaemonSetList(cid, Namespace string) (*DaemonList, error) {
	ctx, cancel, cache, err := utils.ClusterClient(cid)
	defer cancel()
	if err != nil {
		global.TPLogger.Error("GetClusterDaemonList", "error", err)
		return nil, err
	}
	list, err := cache.AppsV1().DaemonSets(Namespace).List(ctx, metav1.ListOptions{})
	if err != nil {
		global.TPLogger.Error("GetClusterDaemonList", "error", err)

		return nil, err
	}
	return &DaemonList{Items: list.Items, Total: len(list.Items)}, nil
}
func (c *k8sCluster) GetClusterDaemonSetInfo(cid, Namespace, DaemonName string) (*appsv1.DaemonSet, error) {
	ctx, cancel, cache, err := utils.ClusterClient(cid)
	defer cancel()
	if err != nil {
		global.TPLogger.Error("GetClusterDaemonInfo", "error", err)
		return nil, err
	}
	daemonSet, err := cache.AppsV1().DaemonSets(Namespace).Get(ctx, DaemonName, metav1.GetOptions{})
	if err != nil {
		global.TPLogger.Error("GetClusterDaemonInfo", "error", err)
		return nil, err
	}
	return daemonSet, nil
}
func (c *k8sCluster) DeleteClusterDaemonSet(cid, Namespace, DaemonName string) error {
	ctx, cancel, cache, err := utils.ClusterClient(cid)
	defer cancel()
	if err != nil {
		global.TPLogger.Error("DeleteClusterDaemon", "error", err)
		return err
	}
	err = cache.AppsV1().DaemonSets(Namespace).Delete(ctx, DaemonName, metav1.DeleteOptions{})
	if err != nil {
		global.TPLogger.Error("DeleteClusterDaemon", "error", err)
		return err
	}
	return nil
}
func (c *k8sCluster) UpdateClusterDaemonSet(cid, Namespace, DaemonYaml string) error {
	ctx, cancel, cache, err := utils.ClusterClient(cid)
	defer cancel()
	if err != nil {
		global.TPLogger.Error("UpdateClusterDaemon", "error", err)
		return err
	}
	data, err := utils.DecodeBase64(DaemonYaml) // 将前端base64编码的字符串解码为原始数据
	if err != nil {
		global.TPLogger.Error("UpdateClusterDaemon", "error", err)
		return err
	}
	daemonSet := &appsv1.DaemonSet{}
	err = json.Unmarshal([]byte(data), daemonSet)
	if err != nil {
		global.TPLogger.Error("UpdateClusterDaemon", "error", err)
		return err
	}
	_, err = cache.AppsV1().DaemonSets(Namespace).Update(ctx, daemonSet, metav1.UpdateOptions{})
	if err != nil {
		global.TPLogger.Error("UpdateClusterDaemon", "error", err)
		return err
	}
	return nil

}
